package modelo;

import java.util.ArrayList;

public abstract class Nave implements Posicionable, Movible, Impactable, Actor {
	
	private ArrayList<Integer> estado;
	private Versor direccion;
	private Casillero casilleroInicial;
	private int largo;
	
    public static final int DESTRUIDA = 0;
    public static final int DANIADA = 1;
    public static final int SANA = 2;   
	
	
	public Nave(Versor unaDireccion, Casillero unCasillero) {
		
		this.estado = new ArrayList<Integer>();
		for (int i = 0; i < this.getLargo(); i++)			
			this.estado.add(SANA);
		
		this.direccion = unaDireccion;
		this.casilleroInicial = unCasillero;
	}
	
	public int getEstado(int indice) {
		return this.estado.get(indice);
	}
	
	public Versor getDireccion() {
		return this.direccion;
	}
	
	public void setDireccion(Versor dir) {
		this.direccion = dir;
	}

	public void setEstado(int indice, int unEstado) {
		this.estado.set(indice, unEstado);
	}
	
	public void setCasilleroInicial(Casillero unCasillero) {
		this.casilleroInicial = unCasillero;
	}
	
	public Casillero getCasilleroInicial() {
		return this.casilleroInicial;
	}
	
	public int getLargo() {
		return this.largo;
	}
	
	public boolean esNave() {
		return true;
	}
	
	
	public void ponerEnTablero() {		
		int x = this.getCasilleroInicial().getX();
		int y = this.getCasilleroInicial().getY();	
		// si no entra por el largo la rota hasta que quede dentro		
		if (!Tablero.coordenadaDentroDelTablero(				
				x + (this.getLargo() - 1) * (this.getDireccion().getX()), 
				y - (this.getLargo() - 1) * (this.getDireccion().getY()))) {
			Versor nuevaDireccion = this.getDireccion();
			nuevaDireccion.rotarADerecha();
			this.setDireccion(nuevaDireccion);
			this.ponerEnTablero();
			return;
		}
		
		for (int i = 0; i < this.getLargo(); i++) {
			Tablero.getInstancia().getCasillero(x + i * (this.getDireccion().getX()),
					  y - i * (this.getDireccion().getY())).ponerContenido(this);			
		}	
		ManejadorDeActores.getInstancia().agregarActor(this);
	}
	
	
	public void quitarDeTablero() {
		int x = this.getCasilleroInicial().getX();
		int y = this.getCasilleroInicial().getY();
		
		for (int i = 0; i < this.getLargo(); i++) {
			Tablero.getInstancia().getCasillero(x + i * (this.getDireccion().getX()),
					  y - i * (this.getDireccion().getY())).quitarContenido(this);
			
		};
		
	}	

	
	private boolean estaEnAlgunBorde() {
		int yFinalNuevo = this.getCasilleroInicial().getY() - this.getDireccion().getY() * this.getLargo();
		int xFinalNuevo = this.getCasilleroInicial().getX() + this.getDireccion().getX() * this.getLargo();
		return (!Tablero.coordenadaDentroDelTablero(xFinalNuevo, yFinalNuevo));		
	}
	
	
	public void mover() {
		
		if (!this.estaEnAlgunBorde()) {
		
			int nuevaXInicial = this.casilleroInicial.getX() + this.direccion.getX();
			int nuevaYInicial = this.casilleroInicial.getY() - this.direccion.getY();
			int nuevaXFinal = this.casilleroInicial.getX() + this.getLargo() * this.direccion.getX();
			int nuevaYFinal = this.casilleroInicial.getY() - this.getLargo() * this.direccion.getY();
			Tablero.getInstancia().getCasillero(this.casilleroInicial.getX(), this.casilleroInicial.getY()).quitarContenido(this);
			this.setCasilleroInicial(Tablero.getInstancia().getCasillero(nuevaXInicial, nuevaYInicial));
			Tablero.getInstancia().getCasillero(nuevaXFinal, nuevaYFinal).ponerContenido(this);
		
		} else {
			int nuevaXInicial = this.casilleroInicial.getX() + (1 - this.getLargo()) * (-this.direccion.getX());
			int nuevaYInicial = this.casilleroInicial.getY() + (1 - this.getLargo()) * this.direccion.getY();
			this.getDireccion().invertir();
			this.setCasilleroInicial(Tablero.getInstancia().getCasillero(nuevaXInicial, nuevaYInicial));
			this.mover();
		}
						
	}
	
	public boolean estaDestruida() {		
		for (int i = 0; i < this.getLargo(); i++)
			if (this.getEstado(i) != DESTRUIDA)
				return false;
		return true;
	}
	
	
	public void actuar() {
		this.mover();
	}
	
}

